package com.atguigu.tingshu.album.api;

import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

@Tag(name = "专辑管理")
@RestController
@RequestMapping("api/album/albumInfo")
@SuppressWarnings({"all"})
public class AlbumInfoApiController {

    @Autowired
    private AlbumInfoService albumInfoService;
    @Autowired
    private AlbumAttributeValueMapper albumAttributeValueMapper;
    @Autowired
    private AlbumStatMapper albumStatMapper;


    /*  /api/album/albumInfo/saveAlbumInfo  */
    @Operation(summary = "保存专辑信息")
    @PostMapping("/saveAlbumInfo")
    public Result saveAlbumInfo(@RequestBody AlbumInfo albumInfo) {
        //下次一定要注意有时保存的时候会有一些中间表或者一些关联表的保存，所以要多注意，细心对比前后端传入数据即可
        // 由于前端还没有开发好，所以要细细比对接口文档以及后端的对象的类的属性
        // 开发者就是测试的直接实施对象
        albumInfoService.saveAlbumInfo(albumInfo);

        return Result.ok();
    }

    /*  /api/album/albumInfo/findUserAlbumPage/{page}/{limit}  */
    @Operation(summary = "分页查询用户专辑列表")
    @PostMapping("/findUserAlbumPage/{page}/{limit}")
    public Result findUserAlbumPage(@PathVariable("page") Long page, @PathVariable("limit") Long perPageSize, @RequestBody AlbumInfoQuery albumInfoQuery) {

        Page<Map<String, Object>> albumWithPage = new Page<>(page, perPageSize);

        return Result.ok(albumInfoService.findUserAlbumPage(albumWithPage, albumInfoQuery));
    }

    /**
     *  /api/album/albumInfo/findUserAllAlbumList
     * @param
     * @return
     */
    @Operation(summary = "查询用户全部专辑列表")
    @GetMapping("/findUserAllAlbumList")
    public Result findUserAllAlbumList() {
       Long userId = AuthContextHolder.getUserId() == null ? 1L : AuthContextHolder.getUserId() ;
        LambdaQueryWrapper<AlbumInfo> queryWrapper = new LambdaQueryWrapper<AlbumInfo>()
                .eq(AlbumInfo::getUserId, userId).orderBy(true,false, AlbumInfo::getId);
//        List<AlbumInfo>  albumListVos = albumInfoService.list(queryWrapper);
        Page<AlbumInfo> albumInfoPage = new Page<>(1, 30);
        albumInfoService.page(albumInfoPage, queryWrapper);
        return Result.ok(albumInfoPage.getRecords());
    }



    /*  /api/album/albumInfo/removeAlbumInfo/{id}   */
    @Operation(summary = "根据id删除专辑")
    @DeleteMapping("/removeAlbumInfo/{id}")
    @Transactional(rollbackFor = Exception.class)
    public Result removeAlbumInfo(@PathVariable("id") Long id) {
        //删除album表，太简单的类型就直接调用service方法即可，没必要在实现类里
        //删除album——statistic表
        //删除属性表 , 应该都是逻辑删除，不需要写sql语句，后期好好研究一下索引，不过索引优化应该不是很复杂，最好嵌入到项目里就最舒服了

        albumInfoService.removeById(id);
        albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, id));
        albumStatMapper.delete(new LambdaQueryWrapper<AlbumStat>().eq(AlbumStat::getAlbumId, id));
        return Result.ok();
    }

    /*  /api/album/albumInfo/updateAlbumInfo/{id}  */
    @Operation(summary = "修改专辑")
    @PutMapping("/updateAlbumInfo/{id}")
    @Transactional(rollbackFor = Exception.class)
    public Result updateAlbumInfo(@PathVariable("id") Long id, @RequestBody AlbumInfo albumInfo) {

       //这种修改直接先删插入就好了
        albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, id));
        albumInfo.getAlbumAttributeValueVoList().stream().forEach(
                albumAttributeValue -> {
                    albumAttributeValue.setAlbumId(id);
                    albumAttributeValueMapper.insert(albumAttributeValue);
                }
        );

        albumInfo.setId(id);
        albumInfoService.updateById(albumInfo);
        return Result.ok();
    }

    /* /api/album/albumInfo/getAlbumInfo/{id}  */
    @Operation(summary = "根据id查询专辑详情")
    @GetMapping("/getAlbumInfo/{id}")
    public Result getAlbumInfo(@PathVariable("id") Long id) {
        AlbumInfo albumInfo = albumInfoService.getById(id);

        //还需要查询属性、属性值表
        List<AlbumAttributeValue> albumAttributeValueVoList = albumAttributeValueMapper.selectList(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, id));
        albumInfo.setAlbumAttributeValueVoList(albumAttributeValueVoList);

        return Result.ok(albumInfo);
    }





}

